package io.kiki.sba.registry.server.shared.comparator;

import io.kiki.sba.registry.common.model.Triple;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;


public class AbstractComparator<T> implements Comparator<T> {
    protected Set<T> added = new HashSet<>();
    protected Set<T> removed = new HashSet<>();
    protected Set<T> remainings = new HashSet<>();
    protected volatile int count;

    @Override
    public Set<T> getAdded() {
        return added;
    }

    @Override
    public Set<T> getRemoved() {
        return removed;
    }

    @Override
    public boolean hasAnyChange() {
        return count > 0;
    }

    @Override
    public int totalChange() {
        return count;
    }

    protected <Type> Triple<Set<Type>, Set<Type>, Set<Type>> getDiff(Collection<Type> current, Collection<Type> future) {

        Set<Type> added = new HashSet<>(future);
        Set<Type> remaining = new HashSet<>(future);
        Set<Type> deleted = new HashSet<>(current);

        added.removeAll(deleted);
        remaining.retainAll(deleted);
        deleted.removeAll(future);

        return new Triple<Set<Type>, Set<Type>, Set<Type>>(added, remaining, deleted);
    }
}
